#include <bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn = 15;
char arr[maxn][maxn];
bool vis[maxn][maxn];
int res[maxn][maxn];
int n,m;

int nex[4][2]={{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int dir[8][2]={{0, 1}, {1, 0}, {0, -1}, {-1, 0}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}};
// 只检查越界
bool check(int x, int y){
	return !(x<=0||x>n||y<=0||y>m);
}


int get(int x, int y){ // 获取九宫格中 黑色的个数
	int cnt=0;
	for(int i=0;i<8;i++){
		int nexi=x+dir[i][0];
		int nexj=y+dir[i][1];
		if(check(nexi, nexj)){
			continue;
		}
		cnt+=res[nexi][nexj];
	}
	return cnt;
}

void dfs(int x,int y){
	int cnt=get(x, y); // 周围的 黑色的个数, 不包括自身
	int tmp=1;
	if(arr[x][y]!='_'){
		tmp=arr[x][y]-'0'-cnt; // 还能出现几个 1
	}
	if(tmp<0){ // 多了 
		return;
	}
	
	for(int i=0;i<4;i++){
		int nexi=x+nex[i][0];
		int nexj=y+nex[i][1];
		if(check(nexi, nexj)||vis[nexi][nexj]){
			continue;
		}
		
		if(tmp > 0) { // 还能是 1
			vis[x][y]=true;
			// 设置为 1
			res[x][y]=1;
			dfs(nexi, nexj);
			vis[x][y]=false;
			res[x][y]=0;
		} 
		
		// 不能是 1
		vis[x][y]=true;
		dfs(nexi, nexj);
		vis[x][y]=false;
	}
}



void solve(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>arr[i][j];	
		}
	}

	dfs(1, 1);
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	return 0;
}
